package com.boil.qz.safekavass.shiro.listener;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.websocket.WebSocketTextServer;
import com.boil.util.Constants;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListenerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by ChenYong on 2017-05-03.
 * <br>
 * Session 监听器。
 */
public class SessionListener extends SessionListenerAdapter {
    /**
     * 日志
     */
    private static Logger log = LoggerFactory.getLogger(SessionListener.class);
    /**
     * 注入 WebSocket 文本服务器
     */
    @Autowired
    private WebSocketTextServer webSocketTextServer;

    /**
     * 监听 Session 创建。
     */
    @Override
    public void onStart(Session session) {
        log.debug("Session：{}--->已创建", session.getId());
    }

    /**
     * 监听 Session 停止。
     */
    @Override
    public void onStop(Session session) {
        try {
            log.debug("Session：{}--->已停止", session.getId());

            // 移除
            boolean removeFlag = Constants.ONLINE_SESSION_ID_LIST.remove(session.getId());

            // 移除成功
            if (removeFlag) {
                // 结果 Vo
                ResultVo onlineSessionCountResultVo = new ResultVo();

                onlineSessionCountResultVo.setResultCode(Constants.ONLINE_SESSION_COUNT);
                onlineSessionCountResultVo.setResultMsg(Constants.ONLINE_SESSION_COUNT_MSG);
                onlineSessionCountResultVo.setResult(Constants.ONLINE_SESSION_ID_LIST.size());

                // 告诉所有客户端，有人退出啦
                webSocketTextServer.sendMessage(onlineSessionCountResultVo);
            }
        } catch (Exception e) {
            log.error("监听 Session--->停止时出现异常，异常信息如下：{}", e);
        }
    }

    /**
     * 监听 Session 过期。
     */
    @Override
    public void onExpiration(Session session) {
        try {
            log.debug("Session：{}--->已过期", session.getId());

            // 移除
            boolean removeFlag = Constants.ONLINE_SESSION_ID_LIST.remove(session.getId());

            // 移除成功
            if (removeFlag) {
                // 结果 Vo
                ResultVo onlineSessionCountResultVo = new ResultVo();

                onlineSessionCountResultVo.setResultCode(Constants.ONLINE_SESSION_COUNT);
                onlineSessionCountResultVo.setResultMsg(Constants.ONLINE_SESSION_COUNT_MSG);
                onlineSessionCountResultVo.setResult(Constants.ONLINE_SESSION_ID_LIST.size());

                // 告诉所有客户端，有人退出啦
                webSocketTextServer.sendMessage(onlineSessionCountResultVo);
            }
        } catch (Exception e) {
            log.error("监听 Session--->过期时出现异常，异常信息如下：{}", e);
        }
    }
}